package com.jiao.store.controller;

import com.jiao.store.controller.ex.*;
import com.jiao.store.entity.User;
import com.jiao.store.service.ex.InsertServiceException;
import com.jiao.store.service.ex.UsernameDuplicatedException;
import com.jiao.store.service.impl.UserServiceImpl;
import com.jiao.store.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

//@Controller
@RestController  //此注解= controller + ResponseBody 两个注解
@RequestMapping("users")
public class UserController  extends  BaseController{

     @Autowired
    private UserServiceImpl userService;

    /**
     *
     * @param user   第一种不需要基类的写法，
     * @return
     *  @RequestMapping("reg")
     *       //@ResponseBody  //将此方法响应结果以json的格式响应到前端
     *      public JsonResult<Void> reg(User user){
     *         //创建响应结果对象
     *             JsonResult<Void>  result =new JsonResult<>();
     *            try {
     *                userService.reg(user);
     *                result.setState(200);
     *                result.setMessage("用户注册成功");
     *                 // 此处catch 过多，后期不便，java代码中有把公共代码抽离出来，提取到父类然后继续继承。
     *            }catch (UsernameDuplicatedException e){
     *                result.setState(4000);
     *                result.setMessage("用户名被占用");
     *            }catch (InsertServiceException e){
     *                result.setState(5000);
     *                result.setMessage("注册产生未知异常");
     *            }
     *         return result;
     *      }
     */
    @RequestMapping("reg")
    //@ResponseBody  //将此方法响应结果以json的格式响应到前端
    public JsonResult<Void> reg(User user){
        //创建响应结果对象
        JsonResult<Void>  result =new JsonResult<>();

            userService.reg(user);
        return  new JsonResult<>(Ok);
    }

    @RequestMapping("login")
    public  JsonResult<User> login(String username, String password, HttpSession session){
        User login = userService.login(username, password);
        session.setAttribute("uid",login.getUid());
        session.setAttribute("username",login.getUsername());

        System.out.println(getUidSession(session));
        System.out.println(getUserNameFromSession(session));
        return new  JsonResult<User>(Ok,login);
    }

    @RequestMapping("updatePassword")
    public  JsonResult<Void> update(String oldPassword,String newPassword,HttpSession session){
        Integer uid=getUidSession(session);
        String  username=getUserNameFromSession(session);
        userService.changePassWord(uid,username,oldPassword,newPassword);

        return new JsonResult<>(Ok);
    }
    @RequestMapping("getByUid")
    public JsonResult<User> getByUid(HttpSession session){
        User byUid = userService.getByUid(getUidSession(session));
        System.out.println("查找id的"+byUid);
        return new  JsonResult<>(Ok,byUid);
    }

    @RequestMapping("updateInfo")
    public  JsonResult<Void> update(User user,HttpSession session){
        Integer uid=getUidSession(session);
        System.out.println("修改的id"+uid);
        String username=getUserNameFromSession(session);
        System.out.println("修改的用户名："+username);
        userService.updateInfo(uid,username,user);
        System.out.println(user.getEmail()+"修改的邮箱");
        System.out.println(user.getGender()+"修改的性别");
        System.out.println(user.getPhone()+"修改的电话");

        return  new JsonResult<>(Ok);
    }
    //上传最大值
    public  static  final int  AVATER_MAX_SIZE = 10*1024*1024;
     // 限制上传文件类型
     public  static  final List<String> AVATER_TYPE=new ArrayList<>();
            static {
                AVATER_TYPE.add("image/jpeg");
                AVATER_TYPE.add("image/png");
                AVATER_TYPE.add("image/gif");
                AVATER_TYPE.add("image/bmp");
            }

    @RequestMapping("updateAvater")  // MultipartFile  此接口 用来做上传 file   和前端上传文件按钮名字一致对应上，会发过来一个’包‘
    // 如果对应不上，也可以使用 RequestParam，用来解决表单和控制层名字不一致，
    public  JsonResult<String> update(Integer uid, @RequestParam("file") MultipartFile file, HttpSession session){
                //1. 先判断是否为空
                   if (file.isEmpty()){
                       throw  new FileEmptyException("文件为孔");
                   }
                //2.大小判断
                if (file.getSize()>AVATER_MAX_SIZE ){
                    throw  new FileSizeException("文件上传过大.超出限制");
                }
                //3.判断类型
                String contentType = file.getContentType();
                //如果集合包含则返回true,就放行，
                if (!AVATER_TYPE.contains(contentType)){
                    throw  new FileTypeException("文件上传的类型不支持");
                }
                //上传文件的位置，这里有一个API
                String parent = session.getServletContext().getRealPath("upload");//获取真实路径
                //File 对象 指向路径 ，那么需要判断file 是否存在，
                File dir =new File(parent);
                if (!dir.exists()){  //判断目录是否存在，
                    dir.mkdirs(); //创建当前目录
                }
                //获取文件名称，然后使用uuid 来生成一个新的字符串作为文件名，这样可以避免文件名一致
                String originalFilename = file.getOriginalFilename();
                 System.out.println("originalFilename:"+originalFilename);
                    //只把文件名更改，不更改文件后缀，所以使用此方法获取文件后缀
                 int index=originalFilename.lastIndexOf(".");
                 String suffix= originalFilename.substring(index);
                 //动态拼接
        String fileName = UUID.randomUUID().toString().toUpperCase()+suffix;
                File dest =new File(dir,fileName);          //是一个空文件
        //  将file文件中数据写入到这个空文件
        try {
            file.transferTo(dest);  //
        } catch (IOException e) {
            throw new FileUploadIOException("文件读写异常");
        }catch (FileStateException e){
            throw  new FileStateException("文件已打开，请关闭重试");
        }
        Integer uidSession = getUidSession(session);
        String userNameFromSession = getUserNameFromSession(session);
        //返回头像的路径，只需要返回一个相对路径
            String avatar="/upload/"+fileName;
        userService.updateAvatar(uidSession,avatar,userNameFromSession);
            //返回头像路径给前端，将来用于前端展示使用
        return new JsonResult<>(Ok,avatar);
    }


}
